HTML Purifier - ochrana před XSS

PHP, JavaScript, Bezpečnost, HTML

Pokud je nutné uživateli umožnit psaní pomocí WISYWIG editoru, je zde velké riziko XSS útoků. HTML Purifier je jeden z nejlepších řešení, jak HTML kód očistit od potencionálně nebezpečného kódu.

HTML Purifier - ochrana před XSS

Nejlepší způsob, jak zabránit útokům XSS je použít jiný způsob zadávání textu než HTML. Například BB kódy, Markdown, nebo jinou podobnou metodu. Pokud je ale použitý WISYWYG editor, je potřeba výstupní HTML řádně odfiltrovat. Od toho je HTML Purifier.

Vždy validní a čisté HTML

HTML Purifier neslouží pouze k vymazání JS a CSS skriptů, ale vrácené HTML bude vždy validní. Možnosti nastavení jsou ale tak obrovské, že počáteční zprovoznění nemusí být vůbec jednoduché. Navíc, HTML 5 není stále oficiálně podporované, i přes pravidelné aktualizace. Naštěstí díky velké komunitě je možnost podporu přidat.

Instalace

Instalaci lze provést pomocí composeru, nebo ručně jak je popsáno v dokumentaci. Pro podporu HTML5 se ale používá balíček xemlock/htmlpurifier-html5, který knihovnu HTML Purifier obsahuje v závislostech. Proto v následující ukázce se počítá s použitím autoloaderu od composeru.

Použití a ukázka

Následující ukázka naznačuje základní nastavení, které jsem připravil pro jeden projekt. Otestovat lze v miniaplikaci na testdata.kutac.cz.

$config = HTMLPurifier_HTML5Config::create([
    // Povolí IDčka u tagů
    'Attr.EnableID'         => true,
    'Attr.ID.HTML5'         => true,
    // Povolí target="_blank" u odkazů, automaticky také dodá
    // rel="noreferrer noopener" proti útokům přes window.opener
    'Attr.AllowedFrameTargets'=> array('_blank','_self','_target','_top'),
    // URL adresy, které nejsou mezi tagy <a> automaticky odkazy udělá
    'AutoFormat.Linkify'    => true,

    // Povolení YouTube a Vimeo iframe, jinak jsou mazány
    'HTML.SafeIframe'       => 'true',
    'URI.SafeIframeRegexp'  => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/)%",
]);

$def = $config->getHTMLDefinition(true);
// Nahradí veškeré tagy b za tagy strong
$def->info_tag_transform['b'] = new HTMLPurifier_TagTransform_Simple('strong');

$purifier = new HTMLPurifier($config);
$clean_html5 = $purifier->purify($content);

Nastavení

V kódu výše je zmíněno pár možností nastavení. Jedná se ale o malou část z kompletního seznamu. Někdy se totiž knihovna může chovat trochu nečekaně a příliš striktně a mazat i části, které by měly zůstat. Pokud taková situace nastává, je nutné projít kompletní dokumentaci, což ale vyžaduje větší znalost definice HTML.


Osobní zkušenosti s knihovnou HTML Purifier, nebo jinou možností filtrování vstupních dat od uživatele můžete sdílet v komentářích.

K tomuto článku již není možné přidávat další komentáře